package com.ww.springboot.boot.controller;

import com.ww.springboot.boot.util.SpringUtil;
import com.ww.springboot.boot.dto.RedisListenerEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

/**
 * todo
 *
 * @author wanwei
 * @since 2021-03-29 14:45
 */
@RestController
@RequestMapping("listen")
public class ListenerController {

    ApplicationEventPublisher applicationEventPublisher;

    RedisTemplate redisTemplate;

    /**
     * 构造器注入   依赖注入核心思想 使用依赖注入则表明将所有管理权都交给容器 即使没有依赖注入 也不应该影响项目启动
     * 方法注入  --过于依赖注入容器了，当没有启动整个依赖容器时，这个类就不能运转，在反射时无法提供这个类需要的依赖
     *
     * @param applicationEventPublisher
     */
    ListenerController(ApplicationEventPublisher applicationEventPublisher, RedisTemplate redisTemplate) {
        this.applicationEventPublisher = applicationEventPublisher;
        this.redisTemplate = redisTemplate;
    }


    @RequestMapping("test")
    public String find(@RequestBody String ss) {
        System.out.println("发布-----" + System.currentTimeMillis());
        RedisListenerEvent redisListenerEvent = new RedisListenerEvent(ss);
        applicationEventPublisher.publishEvent(redisListenerEvent);
        SpringUtil.publishEvent(redisListenerEvent);
        return "";
    }

    @RequestMapping("redisTest")
    public String redisTest(String ss) {
        IntStream.range(0, 20).boxed().forEach(i -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("发布-----" + System.currentTimeMillis());
            redisTemplate.convertAndSend("cacheEvict", ss);
        });
        return "";
    }
}
